/**
  * Author: Mei
  * Date: 2021-01-05 15:06
  * Description: 
  *
  */
#include <memory>
#include <iostream>

using namespace std;

struct A {
    shared_ptr<A> GetSelf() {
        return shared_ptr<A>(this);  //不要这么做
    }
};

struct A1 : public enable_shared_from_this<A1> {
    //因为enable_shared_from_this类中有一个weak_ptr，这个weak_ptr用来观测this智能指针，
    // 调用shared_from_this()方法时，会调用内部这个weak_ptr的lock()方法，将所观测的shared_ptr返回
    //从而不会导致A对象被析构两次
    shared_ptr<A1> GetSelf() {
        return shared_from_this();
    }
};

int main() {
    //1、不要用一个原始指针初始化多个shared_ptr
    int *ptr = new int;
    shared_ptr<int> p1(ptr);
    //shared_ptr<int> p2(ptr);

    //不要再函数实参中创建shared_ptr
    //function(shared_ptr<int>(new int), fun);   //有缺陷
    //可能是先new int，然后调fun，如果调fun发生异常，而shared_ptr<int>还没有创建，则int内存泄露了
    //shared_ptr<int> pt(new int);
    //f(pt, fun());

    //3、通过shared_from_this()返回this指针。不要将this指针作为shared_ptr返回出来，因为this指针本质上是一个裸指针，因此，可能导致重复析构
    shared_ptr<A1> sp1(new A1);
    shared_ptr<A1> sp2 = sp1->GetSelf();

    //4、要避免循环引用。循环引用回导致内存泄露


    return 0;
}